#pragma once
#include "serialportdefine.h"
#include "serialporthandle.h"
#include "serialportconfig.h"
#include "serialportudptx.h"
#include "serialportsqlhelper.h"
#include "msgPackage.h"

// 串口控制类
#define SERIALPORTCTRL_INSTANCE SerialportCtrl::instance()
class SerialportCtrl : public QObject
{
    Q_OBJECT
public:
    static SerialportCtrl* instance();
    ~SerialportCtrl();

private:
    static std::once_flag m_initFlag;
    static std::unique_ptr<SerialportCtrl> m_pInstance;
    SerialportCtrl(QObject *parent = nullptr);

signals:
    // 信号相应
    void sig_recvSerialMsg(QString name, QString msg);

public slots:
    // 相应打开槽
    void initWork();
    // 相应关闭槽
    void exitWork();
    // 接收数据相应
    void onRecvDataFromSerial(QString name, QByteArray msg);

public:
    // 是否打开
    bool isOpened(QString connName);
    // 打开串口
    bool open_port(QString connName, bool bAsync=true);
    // 关闭串口
    void close_port(QString connName);
    // 发送数据
    bool write_data(QString connName, QString strSend, bool isHex = false, int msTimeOut = 3000, bool bAsync = true);
    // 读取数据
    bool read_data(QString connName, QString& strRecv, int msTimeOut = 3000);
    // 发送读取数据
    bool write_read_data(QString connName, QString strSend, QString& strRecv, bool isHex = false, int msTimeOut = 3000);
    // 写入是否16进制
    void setRecvHexData(QString connName, bool bHexData = false);
    // 连接数据库
    void openDbConnect();
private:
    QVector<PSeriaPortInfo>	m_vecSerialInfo;
    QMap<QString, SerialportHandle*> m_mapSerialPort;
    SerialportUdptx m_udpTx;
    SerialportSqlHelper mydb;

    // 初始打开串口
    bool init_open_serial(PSeriaPortInfo info);


};

